/**
 * 链栈实现类
 * 
 * @author 杨满球（本地）
 *
 */
class LinkStack {
	/**
	 * 栈顶节点
	 */
	private Node top;

	/**
	 * 无参构造方法
	 */
	public LinkStack() {
	}

	/**
	 * 有参构造，同时入栈所提供参数
	 * 
	 * @param datas
	 *            存储参数的数组
	 */
	public LinkStack(Object[] datas) {
		for (Object data : datas) {
			this.push(data);
		}
	}

	/**
	 * 清空栈
	 */
	public void clear() {
		this.top = null;
	}

	/**
	 * 判断栈是否为空
	 * 
	 * @return 如果栈为空，方法true，否则返回false
	 */
	public boolean isEmpty() {
		if (this.top == null) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 求栈的元素个数
	 * 
	 * @return 栈的元素个数
	 */
	public int length() {
		Node p = this.top;
		int length = 0;
		while (p != null) {
			p = p.getNextNode();
			length++;
		}
		return length;
	}

	/**
	 * 取栈顶元素数据
	 * 
	 * @return 栈顶元素数据
	 */
	public Object peek() {
		if (this.isEmpty()) {
			return null;
		} else {
			return this.getTop().getData();
		}
	}

	/**
	 * 入栈
	 * 
	 * @param data
	 *            入栈的数据
	 */
	public void push(Object data) {
		Node newNode = new Node(data);
		newNode.setNextNode(this.top);
		this.setTop(newNode);
	}

	/**
	 * 出栈
	 * 
	 * @return 栈顶元素
	 * @throws Exception
	 *             栈为空
	 */
	public Object pop() throws Exception {
		if (this.isEmpty()) {
			throw new Exception("This Stack is empty!");
		} else {
			Node top = this.getTop();
			this.setTop(top.getNextNode());
			return top.getData();
		}
	}

	/**
	 * 获得栈的字符串表达形式
	 * 
	 * @return 栈的字符串表达形式
	 */
	public String getString() {
		if (this.length() == 0) {
			return "This Stack is empty!";
		}
		Node p = this.getTop();
		String linkStackStr = this.getTop().getData().toString();
		while (p.hasNext()) {
			p = p.getNextNode();
			linkStackStr = linkStackStr + " , " + p.getData().toString();
		}
		return linkStackStr;
	}

	public Node getTop() {
		return top;
	}

	public void setTop(Node top) {
		this.top = top;
	}
}
